package future;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @author fei
 * @date 2023/1/5 16:23
 * @description CompletableFuture 获取结果和主动触发计算
 */
public class CompletableFutureAPIDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "abc";
        });

        // 不见不散
        // System.out.println(completableFuture.get());
        // 过时不候
        // System.out.println(completableFuture.get(2L, TimeUnit.SECONDS));
        // 与 get 不一样的是不抛出异常
        // System.out.println(completableFuture.join());
        // 如果线程还没有完成，就先返回输入的默认值
        // System.out.println(completableFuture.getNow("dfasd"));
        // complete(T value): 如果没有计算完成就输出（get 或者 join方法），就以 value 作为默认值输出
        //      返回 true 代表当前执行完成，false 代表还没执行完成
        try{ TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) { e.printStackTrace(); }
        System.out.println(completableFuture.complete("completeValue") + "\t"
                + completableFuture.join());
    }

}
